#ifndef GAMESTATE_H
#define GAMESTATE_H

#include "GameObject.h"
#include "component/Event.h"

#include <string>

#include <vector>
#include <map>

#include <iostream>

namespace eats_core {

/**
 * @brief Classe que representa uma fase ou um estado do jogo. Herda o componente Event para
 * facilitar a captura de eventos de teclado e de mouse. Cada evento deve ser declarado como uma
 * função que sobreescreve as definidas em event.
 *
 * @autor Eusyar Alves
 */
class GameState :public Event
{
    public:

        static const int running = 1, idle = 2, off = 0, finished = 3;

        GameState();

        /**
         * @brief Função responsável por renderizar a fase. Basicamente passa pela lista
         * de objetos e pede para que ela seja renderizada.
         *
         * @autor Eusyar Alves
         */
        virtual bool render();

        /**
         * @brief Função responsável por simular a fase. Basicamente passa pela lista
         * de objetos e pede para que ela seja atualizada. Execução da simulação.
         *
         * @autor Eusyar Alves
         */
        virtual void update();

        /**
         * @brief Função responsável por executar um evento. Chama os eventos guardados
         * na herança dessa classe. Lembrando que é necessário que as funções sejam
         * implementadas dentro dessa nova classe.
         *
         * @autor Eusyar Alves
         */
        void event(SDL_Event* Event) ;

        /**
         * @brief Função responsável por criar ou simplesmente configurar os objetos da fase. Pode correr
         * por todos objetos da lista pedindo para que sejam iniciados.
         *
         * @autor Eusyar Alves
         */
        virtual bool setUp() ;

        /**
         * @brief Função responsável por destruir ou simplesmente preparar a desconstrução. Pode correr
         * por todos objetos da lista pedindo para que sejam 'desligados'.
         *
         * @autor Eusyar Alves
         */
        virtual void tearDown();

        std::string _id;
        std::string _canonical_name;

        int state;
    	int goldMeter;

        //virtual std::vector<GameObject*> getEnemies();

    /**
     * Eventos Suportados
     */
    public:

        void exitEvent();

    /**
     * Componentes
     */
    protected:

        bool disableObject(GameObject * ref);

        typedef struct background_strcut {
        	Uint32 clearColor;
        	SDL_Rect screenRect;
        } Background;

        Background background;

        SDL_Surface * _working_surface;

        std::vector< GameObject* > objList;



};

}

#endif // GAMESTATE_H
